home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Linux / Kubuntu 8.10 / kubuntu-8.10-desktop-i386.iso / casper / filesystem.squashfs / usr / include / asm / byteorder.h < prev    next >
C/C++ Source or Header  |  2008-10-24  |  1KB  |  82 lines

  1. #ifndef _ASM_X86_BYTEORDER_H
  2. #define _ASM_X86_BYTEORDER_H
  3.  
  4. #include <asm/types.h>
  5.  
  6.  
  7. #ifdef __GNUC__
  8.  
  9. #ifdef __i386__
  10.  
  11. static inline __u32 ___arch__swab32(__u32 x)
  12. {
  13. #ifdef CONFIG_X86_BSWAP
  14.     asm("bswap %0" : "=r" (x) : "0" (x));
  15. #else
  16.     asm("xchgb %b0,%h0\n\t"    /* swap lower bytes    */
  17.         "rorl $16,%0\n\t"    /* swap words        */
  18.         "xchgb %b0,%h0"    /* swap higher bytes    */
  19.         : "=q" (x)
  20.         : "0" (x));
  21. #endif
  22.     return x;
  23. }
  24.  
  25. static inline __u64 ___arch__swab64(__u64 val)
  26. {
  27.     union {
  28.         struct {
  29.             __u32 a;
  30.             __u32 b;
  31.         } s;
  32.         __u64 u;
  33.     } v;
  34.     v.u = val;
  35. #ifdef CONFIG_X86_BSWAP
  36.     asm("bswapl %0 ; bswapl %1 ; xchgl %0,%1"
  37.         : "=r" (v.s.a), "=r" (v.s.b)
  38.         : "0" (v.s.a), "1" (v.s.b));
  39. #else
  40.     v.s.a = ___arch__swab32(v.s.a);
  41.     v.s.b = ___arch__swab32(v.s.b);
  42.     asm("xchgl %0,%1"
  43.         : "=r" (v.s.a), "=r" (v.s.b)
  44.         : "0" (v.s.a), "1" (v.s.b));
  45. #endif
  46.     return v.u;
  47. }
  48.  
  49. #else /* __i386__ */
  50.  
  51. static inline __u64 ___arch__swab64(__u64 x)
  52. {
  53.     asm("bswapq %0"
  54.         : "=r" (x)
  55.         : "0" (x));
  56.     return x;
  57. }
  58.  
  59. static inline __u32 ___arch__swab32(__u32 x)
  60. {
  61.     asm("bswapl %0"
  62.         : "=r" (x)
  63.         : "0" (x));
  64.     return x;
  65. }
  66.  
  67. #endif
  68.  
  69. /* Do not define swab16.  Gcc is smart enough to recognize "C" version and
  70.    convert it into rotation or exhange.  */
  71.  
  72. #define __arch__swab64(x) ___arch__swab64(x)
  73. #define __arch__swab32(x) ___arch__swab32(x)
  74.  
  75. #define __BYTEORDER_HAS_U64__
  76.  
  77. #endif /* __GNUC__ */
  78.  
  79. #include <linux/byteorder/little_endian.h>
  80.  
  81. #endif /* _ASM_X86_BYTEORDER_H */
  82.